package affichage;


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import deroulementjeu.TypeEquipe;

import unite.Distance;
import unite.Jouable;
import unite.TypeUnite;
import unite.Unite;


/**
 * Le panel qui est affiché en bas de la fenêtre de jeu, qui contient les infos
 * de l'unité sélectionnée sur le terrain, ainsi que la mini-map. Il sert aussi
 * à l'utilisateur (grâce à des boutons) d'intéragir avec le jeu.
 * @author Alexis BRASY, Geoffrey LEQUESNE, Sandrine PIRIOU, Michel POPOV
 *
 */
public class MenuBas extends JPanel implements MouseListener {

    /** Entier nécessaire à la sérialisation */
    private static final long serialVersionUID = 1L;
    /** Entier qui signifie si une unité est sélectionnée ou non */
    private int selection = 0;
    /** L'unité sélectionnée */
    private Unite unite;
    /** La vue du serpent */
    private TerrainView tv;
    /** Les 4 boutons du panel MenuBas pour les actions de l'utilisateur */
    private JButton butDep, butAtt, butPass, butPotion;
    /** Le panel MiniMap */
    private MiniMap minimap;
    /** Les 4 panels à afficher dans le MenuBas */
    private JPanel stat, portrait, map, buts;
	
    /**
     * Constructeur du MenuBas
     * @param fenetre la fenêtre où afficher le MenuBas
     * @param tv la vue du terrain
     */
    public MenuBas(JFrame fenetre, TerrainView tv) {	
        this.tv = tv;
        this.setLayout(new GridLayout(1, 3));
        portrait = new JPanel();
        stat = new JPanel();
        map = new JPanel();
        buts = new JPanel();
        butDep = new JButton("Valider déplacement");
        butDep.addActionListener(new DeplListener());
        butAtt = new JButton("Attaquer à distance");
        butAtt.addActionListener(new AttListener());
        butPass = new JButton("Terminer le tour");
        butPass.addActionListener(new PasserTourListener());
        butPotion = new JButton("Utiliser une potion");
        butPotion.addActionListener(new utiliserPotionListener());
    	
        portrait.setBackground(Color.white);
        portrait.setBorder(BorderFactory.createTitledBorder("Portrait"));
        portrait.setPreferredSize(new Dimension(150, 120));
    	
        stat.setBackground(Color.white);
        stat.setBorder(BorderFactory.createTitledBorder("Statistiques"));
        stat.setPreferredSize(new Dimension(300, 120));
		
        map.setBackground(Color.white);
        map.setBorder(BorderFactory.createTitledBorder("Map"));
        map.setPreferredSize(new Dimension(100, 120));
		
        buts.setBackground(Color.white);
        buts.setBorder(BorderFactory.createTitledBorder("Actions"));
        buts.setPreferredSize(new Dimension(300, 120));
		
        afficherMenu();
        suprimerMenu();
		
    }
	
    /**
     * Getter du bouton Attaque à distance
     * @return le bouton
     */
    public JButton getButtonAttDist() {
        return butAtt;
    }
	
    /**
     * On affiche le menu
     */
    public void afficherMenu() {
        if (this.selection == 1) {	
			
            // PORTRAIT
            int niveau = unite.getNiveau();

            portrait.removeAll();	
            stat.removeAll();
            map.removeAll();
            buts.removeAll();
            butPotion.removeAll();
            ImageIcon icon = null;
			
            switch (unite.getType()) {
				
            case FEU: 
                if (niveau == 0) {
                    icon = new ImageIcon("img/portraitsalameche.jpg");
                } 
                if (niveau == 1) {
                    icon = new ImageIcon("img/portraitreptincel.jpg");
                } 
                if (niveau >= 2) {
                    icon = new ImageIcon("img/portraitdracaufeu.jpg");
                } 					
                break;
				
            case PLANTE: 
                if (niveau == 0) {
                    icon = new ImageIcon("img/portraitbulbizarre.jpg");
                } 
                if (niveau == 1) {
                    icon = new ImageIcon("img/portraitherbizarre.jpg");
                } 
                if (niveau >= 2) {
                    icon = new ImageIcon("img/portraitflorizarre.jpg");
                } 	
                break;
				
            case EAU:
                if (niveau == 0) {
                    icon = new ImageIcon("img/portraitcarapuce.jpg");
                } 					
                if (niveau == 1) {
                    icon = new ImageIcon("img/portraitcarabaffe.jpg");
                } 
                if (niveau >= 2) {
                    icon = new ImageIcon("img/portraittortank.jpg");
                }
                break;
					
            case ELECTRIQUE: 
                if (niveau == 0) {
                    icon = new ImageIcon("img/portraitpichu.jpg");
                } 
                if (niveau == 1) {
                    icon = new ImageIcon("img/portraitpikachu.jpg");
                } 
                if (niveau >= 2) {
                    icon = new ImageIcon("img/portraitraichu.jpg");
                }
                break;

            case VOL: 
                if (niveau == 0) {
                    icon = new ImageIcon("img/portraitroucool.jpg");
                }
                if (niveau == 1) {
                    icon = new ImageIcon("img/portraitroucoups.jpg");
                } 
                if (niveau >= 2) {
                    icon = new ImageIcon("img/portraitroucarnage.jpg");
                }
                break;

            case DRESSEUR: 
					
                if (this.unite.getEquipe().getCouleur().equals(Color.red)) {
                    icon = new ImageIcon("img/portraitdresseurmec.jpg");
                } else {
                    icon = new ImageIcon("img/portraitdresseurfille.jpg");
                } 
                break;

            case OBSTACLE:
                icon = new ImageIcon("img/portrait_obstacle.jpg");
                break;

            case POTION:
                icon = new ImageIcon("img/portraitpotion.jpg");
                break;

            case TELEPORTEUR:
                icon = new ImageIcon("img/warning.jpg");
                break;

            default:
                icon = new ImageIcon("img/warning.jpg"); // break;
			
                portrait.repaint();
            }
			
            JLabel img = new JLabel(icon);

            img.setSize(85, 85);
            portrait.add(img, BorderLayout.NORTH);
			
            // Boutton
			
            if (this.tv.getItineraireEnCours() != null
                    && this.tv.getItineraireEnCours().getListeCases() != null
                    && this.unite.getEquipe()
                            == this.tv.getPartie().getEquipeEnCours()) {
                if (this.tv.getItineraireEnCours().getListeCases().size() > 1) {
                    butDep.setEnabled(true);
                    this.repaint();
                } else {
                    butDep.setEnabled(false);
                }
				
                if (this.unite.getEquipe().getNbPotions() > 0
                        && this.unite.getDeplacement() > 0) {
                    butPotion.setEnabled(true);
                } else {
                    butPotion.setEnabled(false);
                }
				
                this.repaint();
				
                if (this.unite.getType() != TypeUnite.ELECTRIQUE
                        || (this.unite.getType() == TypeUnite.ELECTRIQUE
                                && this.unite.getDeplacement() == 0)) {
                    butAtt.setEnabled(false);
                } else {
                    butAtt.setEnabled(true);
                }
				
                buts.setLayout(new GridLayout(4, 1));
			
                if (this.unite.getType() != TypeUnite.DRESSEUR) {
                    buts.add(butDep);
                    if (unite.getEquipe().getNbPotions() > 0
                            && unite.getDeplacement() > 0) {
                        butPotion.add(
                                new JLabel(
                                        "Potion="
                                                + unite.getEquipe().getNbPotions()));
                    }
                    buts.add(butPotion);
                } else {
                    buts.remove(butDep);
                    buts.remove(butPotion);
                }
                if (this.unite.getType() == TypeUnite.ELECTRIQUE) {
                    buts.add(butAtt);
                } else {
                    buts.remove(butAtt);
                }
                buts.add(butPass);
                buts.setBackground(Color.white);
                buts.setPreferredSize(new Dimension(160, 120));
				
                this.add(buts, BorderLayout.SOUTH);
            }
			
            // STAT
            stat.setSize(300, 300);
            if (!unite.estObjet()) {
                JLabel label1 = new JLabel("Attaque");
                JLabel label2 = new JLabel("Défense");
                JLabel label3 = new JLabel("PV");
                JLabel label4 = new JLabel("Déplacement");
                JLabel label5 = new JLabel("XP");
                JLabel label6 = new JLabel("Vision");
				
                JLabel label2_1 = new JLabel("" + unite.getAttaque());
                JLabel label2_2 = new JLabel("" + unite.getDefense());
                JLabel label2_3 = new JLabel("" + unite.getPv());
                JLabel label2_4 = new JLabel("" + unite.getDeplacement());
                JLabel label2_5 = new JLabel("" + unite.getXp());
                JLabel label2_6 = new JLabel("" + unite.getVision());
				
                stat.setLayout(new GridLayout(7, 2));			
				
                label1.setHorizontalAlignment(JLabel.CENTER);
                label2.setHorizontalAlignment(JLabel.CENTER);
                label3.setHorizontalAlignment(JLabel.CENTER);
                label4.setHorizontalAlignment(JLabel.CENTER);
                label5.setHorizontalAlignment(JLabel.CENTER);
                label6.setHorizontalAlignment(JLabel.CENTER);
				
                label2_1.setHorizontalAlignment(JLabel.CENTER);
                label2_2.setHorizontalAlignment(JLabel.CENTER);
                label2_3.setHorizontalAlignment(JLabel.CENTER);
                label2_4.setHorizontalAlignment(JLabel.CENTER);
                label2_5.setHorizontalAlignment(JLabel.CENTER);
                label2_6.setHorizontalAlignment(JLabel.CENTER);
				
                icon = new ImageIcon("img/marqueur_trefle.jpg");
                JLabel img1 = new JLabel(icon);

                img1.setSize(10, 10);
                img1.setHorizontalAlignment(JLabel.CENTER);
				
                icon = new ImageIcon("img/marqueur_tete.jpg");
                JLabel img2 = new JLabel(icon);

                img2.setSize(10, 10);
                img2.setHorizontalAlignment(JLabel.CENTER);
							
                if (unite.estChanceux()) {
                    stat.add(img1);
                } else {
                    stat.add(new JLabel(""));
                }
							
                
				
                if (unite.estPresqueMort()) {
                    stat.add(img2);
                } else {
                    stat.add(new JLabel(""));
                }
						
                
				
                stat.add(label1);
                stat.add(label2_1);
				
                stat.add(label2);
                stat.add(label2_2);
				
                stat.add(label3);
                stat.add(label2_3);
				
                stat.add(label4);
                stat.add(label2_4);
				
                stat.add(label5);
                stat.add(label2_5);
				
                stat.add(label6);
                stat.add(label2_6);
            } else {
                if (unite.getType() == TypeUnite.POTION) {
                    stat.setLayout(new GridLayout(6, 1));
                    stat.add(new JLabel(""));
                    stat.add(new JLabel(""));
                    JLabel label1 = new JLabel(
                            "Cette potion permet à un Pokémon de");

                    label1.setHorizontalAlignment(JLabel.CENTER);
                    stat.add(label1);
                    JLabel label2 = new JLabel("regagner tous ses PV");

                    label2.setHorizontalAlignment(JLabel.CENTER);
                    stat.add(label2);
                } else if (unite.getType() == TypeUnite.OBSTACLE) {
                    stat.setLayout(new GridLayout(6, 1));
                    stat.add(new JLabel(""));
                    stat.add(new JLabel(""));
                    JLabel label1 = new JLabel(
                            "Cet obstacle barre le chemin, il peut être ");

                    label1.setHorizontalAlignment(JLabel.CENTER);
                    stat.add(label1);
                    JLabel label2 = new JLabel(
                            "détruit par une attaque au corps à corps");

                    label2.setHorizontalAlignment(JLabel.CENTER);
                    stat.add(label2);
                }
            }
			
            // MAP
            minimap = new MiniMap(this.tv);
            map.setLayout(new GridLayout(1, 1));			
            map.add(minimap);
				
            this.add(portrait);
            this.add(stat);	
            this.add(buts);
            this.add(map);
			
        }

    }
    
	/**
	 * Supprimer le menu de la fenêtre
	 */
    public void suprimerMenu() {
        if (this.selection != 1) {
            this.remove(buts);
            this.remove(portrait);
            this.remove(stat);
            this.remove(map);
        }
    }
	
    /**
     * Getter de la sélection (savoir si une unité est sélectionnée ou non)
     * @return la sélection
     */
    public int getSelection() {
        return selection;
    }

    /**
     * Setter de la sélection
     * @param selection
     */
    public void setSelection(int selection) {
        this.selection = selection;
    }

    /**
     * Getter de l'unité sélectionnée
     * @return l'unité
     */
    public Unite getUnite() {
        return unite;
    }

    /**
     * Setter de l'unité sélectionnée
     * @param unite
     */
    public void setUnite(Unite unite) {
        this.unite = unite;
    }

    @Override
    public void mouseClicked(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {}

    @Override
    public void mouseExited(MouseEvent e) {}

    @Override
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseReleased(MouseEvent e) {}
	
    /**
     * La classe qui écoute le bouton "Valider déplacement"
     * @author Alexis BRASY, Geoffrey LEQUESNE, Sandrine PIRIOU, Michel POPOV
     *
     */
    class DeplListener  implements ActionListener {
		 
        /**
         * Redéfinition de la méthode actionPerformed
         */
        public void actionPerformed(ActionEvent arg0) {
            tv.getItineraireEnCours().valider();
        	
            // On vide les listes de cases où l'unité peut se déplacer, et celles où elle se déplace
            tv.getCaseDeplacement().removeAll(tv.getCaseDeplacement());
            tv.getItineraireEnCours().getListeCases().removeAll(
                    tv.getItineraireEnCours().getListeCases());
            // On empèche le joueur de recliquer sur "Valider le déplacement"
            butDep.setEnabled(false);
            // Si l'unité était un type électrique, on l'epèche aussi d'attaquer
            if (tv.getPokemonSelected().getType() == TypeUnite.ELECTRIQUE) {
                butAtt.setEnabled(false);
            }
            // On retrouve les nouvelles case qui ne sont pas dans le brouillard de guerre
            tv.setCasesAAfficher(
                    tv.getPartie().getEquipeEnCours().getCasesAffichables());
    			
            tv.getMenu2().afficherMenu();
            tv.getFenetre().setSize(tv.getFenetre().getWidth() + 1,
                    tv.getFenetre().getHeight());
            tv.getFenetre().setSize(tv.getFenetre().getWidth() - 1,
                    tv.getFenetre().getHeight());	
        }
       
    }
	
    /**
     * La classe qui écoute le bouton "Attaquer à distance"
     * @author Alexis BRASY, Geoffrey LEQUESNE, Sandrine PIRIOU, Michel POPOV
     *
     */
    class AttListener  implements ActionListener {

    	/**
    	 * Redéfinition de la méthode actionPerformed
    	 */
        @Override
        public void actionPerformed(ActionEvent arg0) {
            Distance attaquant = (Distance) unite;

            tv.setCasesAttDist(attaquant.getListeCasesTerrainAttaquables());
            tv.getCaseDeplacement().removeAll(tv.getCaseDeplacement());
            tv.setAttDist(true);
            /* 
            System.out.println(
                    "Listes des cases terrain : "
                            + attaquant.getListeCasesTerrainAttaquables().size());
            */
        }
		 
    }
	 
    /**
     * La classe qui écoute le bouton "Utiliser potion"
     * @author Alexis BRASY, Geoffrey LEQUESNE, Sandrine PIRIOU, Michel POPOV
     *
     */
    class utiliserPotionListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            if (
                    unite.getType() != TypeUnite.DRESSEUR
                    && unite.getType() != TypeUnite.POTION
                    && unite.getType() != TypeUnite.OBSTACLE
                    && unite.getType() != TypeUnite.TELEPORTEUR	
                    ) {	 
                Jouable j = (Jouable) unite;

                j.utiliserPotion();				
				
                tv.getMenu2().setSelection(0);
                tv.getMenu2().suprimerMenu();
                tv.getFenetre().setSize(tv.getFenetre().getWidth() + 1,
                        tv.getFenetre().getHeight());
                tv.getFenetre().setSize(tv.getFenetre().getWidth() - 1,
                        tv.getFenetre().getHeight());
				
                unite.getEquipe().setNbPotions(
                        unite.getEquipe().getNbPotions() - 1);
                butPotion.removeAll();
					
                if (tv.getItineraireEnCours() != null) {
                    tv.getItineraireEnCours().getListeCases().removeAll(
                            tv.getItineraireEnCours().getListeCases());
                }
                if (tv.getCaseDeplacement() != null) {
                    tv.getCaseDeplacement().clear();
                }
                if (tv.getCasesAttDist() != null) {
                    tv.getCasesAttDist().clear();
                }
					
                unite.setDeplacement(0);
            }
        }
			 
    }
	 
	
    /**
     * La classe qui écoute le bouton "Terminer le tour"
     * @author Alexis BRASY, Geoffrey LEQUESNE, Sandrine PIRIOU, Michel POPOV
     *
     */
    class PasserTourListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            tv.getMenu2().setSelection(0);
            tv.getMenu2().suprimerMenu();
            tv.getFenetre().setSize(tv.getFenetre().getWidth() + 1,
                    tv.getFenetre().getHeight());
            tv.getFenetre().setSize(tv.getFenetre().getWidth() - 1,
                    tv.getFenetre().getHeight());
			
            if (tv.getCaseDeplacement() != null) {
                tv.getCaseDeplacement().removeAll(tv.getCaseDeplacement());
            }
            tv.getItineraireEnCours().getListeCases().removeAll(
                    tv.getItineraireEnCours().getListeCases());
            if (tv.getPartie().finDePartie() != null) {
                new FinPartieView(tv.getPartie(),
                        tv.getPartie().finDePartie().getEnnemi());
            } else {
                tv.getPartie().getEquipeEnCours().regenPVfinTour();
                tv.getPartie().getEquipeEnCours().initTour();
				
                if (tv.getPartie().getEquipeEnCours().getEnnemi().getType().equals(
                        TypeEquipe.ORDINATEUR)) {
                    tv.getPartie().getEquipeEnCours().getEnnemi().tourDeJeuIA();
                    tv.getPartie().getEquipeEnCours().getEnnemi().regenPVfinTour();
                    tv.getPartie().getEquipeEnCours().getEnnemi().initTour();
                    if (tv.getPartie().finDePartie() != null) {
                        new FinPartieView(tv.getPartie(),
                                tv.getPartie().finDePartie().getEnnemi());
                    }
                    tv.setCasesAAfficher(
                            tv.getPartie().getEquipeEnCours().getCasesAffichables());
                } else {
                    tv.getCasesAAfficher().removeAll(tv.getCasesAAfficher());
                    if (tv.getPartie().getEquipeEnCours().getEnnemi().getCouleur().equals(
                            Color.red)) {
                        JOptionPane.showMessageDialog(null,
                                "C'est au joueur rouge de jouer !",
                                "Information", JOptionPane.INFORMATION_MESSAGE);
                    } else {
                        JOptionPane.showMessageDialog(null,
                                "C'est au joueur bleu de jouer !", "Information",
                                JOptionPane.INFORMATION_MESSAGE);
                    }
                    tv.getPartie().setEquipeEnCours(
                            tv.getPartie().getEquipeEnCours().getEnnemi());
                    tv.setCasesAAfficher(
                            tv.getPartie().getEquipeEnCours().getCasesAffichables());
                }
            }
        }
    }
}
